package klassisch;

public class HillClimbing_neu extends Algo {
	
	
/*
 * TODO 
 * http://de.wikipedia.org/wiki/Downhill-Simplex-Verfahren
 * 
 * */
	public HillClimbing_neu(int grad, int maxRunden) {
		super(grad, maxRunden);
	}

	public void optimieren() {
		double arrVn[] = new double[arrBest.length];
		double arrCurrent[] = new double[arrBest.length];

		double fitnessN;
		double fitnessC;
		final int nachbarn = 10;
		int n;

		boolean local;
		for (int i = 0; i < maxRunden; i++) {
			init(arrCurrent);
			fitnessC = eval(arrCurrent);
			local = true; // das ist richtig !!! Sonst haben wir eine Endlosschleife!!!
				//--> http://www.purebasic.com/german/documentation/reference/repeat_until.html
			/**
			 *    a=0
				  Repeat
				    a=a+1
				  Until a>100 
				  
				  // in java
				  a = 0
				  do {
				  }while(a < 100);
			 * */
			System.out.println("FitC " +fitnessC +  " \t \t best " + fitnessBest);
			System.out.println(wz(arrCurrent));
			n =0;
			do {
				erzeugeNachbarn(arrVn, arrCurrent);
				fitnessN = eval(arrVn);
				//System.out.println("FitN " + fitnessN);
				System.out.println(wz(arrVn));

				if (fitnessN < fitnessC) {
					arrCurrent = arrVn.clone();
					fitnessC = fitnessN;
					System.out.println(" ** Verbesserung**");
					n /= 2; 
				} else {
					//System.out.println("raus");
					local = false;
					if(n++ > nachbarn)
						local = true;
				}
				aufwand++;
			} while (!local);
			
			System.out.println("_____________");
			if (fitnessBest > fitnessC) {
				arrBest = arrVn.clone();
				fitnessBest = fitnessC;
			} 
			aufwand++;
		}
	}
	
	public void erzeugeNachbarn(double vn[], double vcurrent[])
	{
		double tmp; //TODO nach dem testen .. ohne arbeiten
		for (int i = 0; i < vn.length; i++) {		
			
			tmp =  r.nextGaussian() % 0.5;
			vn[i] = vcurrent[i] + tmp;  //EUGEN  ... hat dem grams nicht gefallen
			
			//if(i == 0) 
			//	System.out.printf("vc[0] %.5f \tvn[0] %.5f \t tmp %.5f\n",vcurrent[i], vn[i], tmp);
		} 
		
	}
	
	public static void main(String[] args) {
		HillClimbing_neu hill = new HillClimbing_neu(4,1000);
		hill.optimieren();
		hill.ergebnisAusgabe();
		
		/* zum Vergleich Grad 2  
		 * Mutation Selection: 
			Fitness: 0,1419
			Aufwand: 1454
		 */
	}

}
